interface ListNode {
	val: number;
	next: ListNode | null;
}

/**
 * **[2. 两数相加](https://leetcode.cn/problems/add-two-numbers/)**
 *
 * 给你两个 **非空** 的链表，表示两个非负的整数。它们每位数字都是按照 **逆序** 的方式存储的，并且每个节点只能存储 **一位** 数字。
 *
 * 请你将两个数相加，并以相同形式返回一个表示和的链表。
 *
 * 你可以假设除了数字 0 之外，这两个数都不会以 0 开头。
 *
 * @param l1
 * @param l2
 * @returns
 */
export default function (l1: ListNode | null, l2: ListNode | null): ListNode | null {
	if (!l1 && !l2) return null;

	let flag = false;
	const head: ListNode = { val: 0, next: null };
	{
		const val1 = l1?.val ?? 0;
		const val2 = l2?.val ?? 0;
		const sum = val1 + val2;
		flag = sum >= 10;
		head.val = sum % 10;
	}

	const defaultNode: ListNode = { val: 0, next: null };

	let current = head;
	let c1 = l1,
		c2 = l2;
	while (!!c1?.next || !!c2?.next) {
		c1 = c1?.next || defaultNode;
		c2 = c2?.next || defaultNode;

		const sum = c1.val + c2.val + (flag ? 1 : 0);
		flag = sum >= 10;
		const next: ListNode = { val: flag ? sum - 10 : sum, next: null };
		current.next = next;
		current = next;
	}

	if (flag) {
		current.next = { val: 1, next: null };
	}

	return head;
}
